package service

import (
	"context"
	"errors"
	"fmt"
	"time"
	"gitee.com/chunanyong/logger"
	"gitee.com/chunanyong/zorm"
	"code/structs"
)

//SaveGroupStruct 保存 分组
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func SaveGroupStruct(ctx context.Context, groupstruct *structs.GroupStruct) error {

    // groupstruct对象指针不能为空
	if  groupstruct == nil {
		return errors.New("groupstruct对象指针不能为空")
	}
    //匿名函数return的error如果不为nil,事务就会回滚
	_, errSaveGroupStruct := zorm.Transaction(ctx,func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		

		_,errSaveGroupStruct := zorm.Insert(ctx, groupstruct)

		if errSaveGroupStruct != nil {
			return nil, errSaveGroupStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errSaveGroupStruct != nil {
		errSaveGroupStruct := fmt.Errorf("service.SaveGroupStruct错误:%w", errSaveGroupStruct)
		logger.Error(errSaveGroupStruct)
		return errSaveGroupStruct
	}

	return nil
}

//UpdateGroupStruct 更新分组
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateGroupStruct(ctx context.Context, groupstruct *structs.GroupStruct) error {


	// groupstruct对象指针或主键Id不能为空
	if  groupstruct == nil || len(groupstruct.Id) < 1 {
		return errors.New("groupstruct对象指针或主键Id不能为空")
	}

    //匿名函数return的error如果不为nil,事务就会回滚
	_, errUpdateGroupStruct := zorm.Transaction(ctx,func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_,errUpdateGroupStruct := zorm.Update(ctx, groupstruct)


		if errUpdateGroupStruct != nil {
			return nil, errUpdateGroupStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errUpdateGroupStruct != nil {
		errUpdateGroupStruct := fmt.Errorf("service.UpdateGroupStruct错误:%w", errUpdateGroupStruct)
		logger.Error(errUpdateGroupStruct)
		return errUpdateGroupStruct
	}

	return nil
}

//UpdateNotZeroGroupStruct 更新分组
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateNotZeroGroupStruct(ctx context.Context, groupstruct *structs.GroupStruct) error {

	// groupstruct对象指针或主键Id不能为空
    if  groupstruct == nil || len(groupstruct.Id) < 1 {
    	return errors.New("groupstruct对象指针或主键Id不能为空")
    }

    //匿名函数return的error如果不为nil,事务就会回滚
	_, errUpdateGroupStruct := zorm.Transaction(ctx,func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_,errUpdateGroupStruct := zorm.UpdateNotZeroValue(ctx, groupstruct)


		if errUpdateGroupStruct != nil {
			return nil, errUpdateGroupStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errUpdateGroupStruct != nil {
		errUpdateGroupStruct := fmt.Errorf("service.UpdateNotZeroGroupStruct错误:%w", errUpdateGroupStruct)
		logger.Error(errUpdateGroupStruct)
		return errUpdateGroupStruct
	}

    return nil
}

//DeleteGroupStructById 根据Id删除分组
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func DeleteGroupStructById(ctx context.Context, id string) error {


	//id不能为空
	if len(id) < 1 {
		return errors.New("id不能为空")
	}

    //匿名函数return的error如果不为nil,事务就会回滚
	_, errDeleteGroupStruct := zorm.Transaction(ctx,func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		finder := zorm.NewDeleteFinder(structs.GroupStructTableName).Append(" WHERE id=?", id)
		_,errDeleteGroupStruct := zorm.UpdateFinder(ctx, finder)


		if errDeleteGroupStruct != nil {
			return nil, errDeleteGroupStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

    //记录错误
	if errDeleteGroupStruct != nil {
		errDeleteGroupStruct := fmt.Errorf("service.DeleteGroupStruct错误:%w", errDeleteGroupStruct)
		logger.Error(errDeleteGroupStruct)
		return errDeleteGroupStruct
	}

	return nil
}

//FindGroupStructById 根据Id查询分组信息
//ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func FindGroupStructById(ctx context.Context, id string) (*structs.GroupStruct, error) {
	//id不能为空
	if len(id) < 1 {
		return nil, errors.New("id不能为空")
	}

	//根据Id查询
	finder := zorm.NewSelectFinder(structs.GroupStructTableName).Append(" WHERE id=?", id)
	groupstruct := structs.GroupStruct{}
	has, errFindGroupStructById := zorm.QueryRow(ctx, finder, &groupstruct)

	//记录错误
	if errFindGroupStructById != nil {
		errFindGroupStructById := fmt.Errorf("service.FindGroupStructById错误:%w", errFindGroupStructById)
		logger.Error(errFindGroupStructById)
		return nil, errFindGroupStructById
	}

    if !has {
		return nil,nil
	}


	return &groupstruct, nil

}

//FindGroupStructList 根据Finder查询分组列表
//ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func FindGroupStructList(ctx context.Context, finder *zorm.Finder, page *zorm.Page) ([]structs.GroupStruct, error) {

	//finder不能为空
	if finder == nil {
		return nil, errors.New("finder不能为空")
	}

	groupstructList := make([]structs.GroupStruct, 0)
	errFindGroupStructList := zorm.Query(ctx, finder, &groupstructList, page)

	//记录错误
	if errFindGroupStructList != nil {
		errFindGroupStructList := fmt.Errorf("service.FindGroupStructList错误:%w", errFindGroupStructList)
		logger.Error(errFindGroupStructList)
		return nil, errFindGroupStructList
	}

	return groupstructList, nil
}
